; 进入保护模式
%include "Macro/protect.inc"
jmp	START

START:
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	mov	ss, ax
	mov	sp, 0100h
	
	; 设置GDTR的基地址
	xor	eax, eax
	mov	ax, ds
	shl	eax, 4
	add	eax, GDT		; eax <- gdt 基地址
	mov	dword [GdtPtr + 2], eax	; [GdtPtr + 2] <- gdt 基地址
	; 加载 GDTR
	lgdt [GdtPtr]

	; 关中断
	cli

	; 打开地址线A20
	in	al, 92h
	or	al, 00000010b
	out	92h, al

	; 准备切换到保护模式
	mov	eax, cr0
	or	eax, 1
	mov	cr0, eax

	; 真正进入保护模式
	jmp	dword SelectorCode32:0	; 执行这一句会把 SelectorCode32 装入 cs,
								; 并跳转到 Code32Selector:0  处

; GDT表
; 这里只要一个代码段就够了，数据段什么的都没卵用，进入32位模式后再建个gdt表
align 8
GDT:	   	
Descriptor		0,			0,	0	; 空描述符
DESC_CODE32:	Descriptor  0,	0x7ff,	PT_CD_E+PT_S+PT_P_VALID+PT_D_32	; 非一致代码段
; GDT 结束
GdtLen		equ	$ - GDT		; GDT长度
GdtPtr		dw	GdtLen - 1	; GDT界限
			dd	0			; GDT基地址

; GDT 选择子
SelectorCode32		equ	DESC_CODE32	- GDT